package com.dnbiz.api.sdk.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * <pre>
 *  * JSON常用转换类
 * </pre>
 * @author JWinder(2010-9-3)
 */
public class JsonUtil {
	
    /**
     * 根据泛型实体类转换成json字符串
     * @author HuangFeng(Mar 19, 2010)
     * @param <T> 泛型
     * @param t 泛型实体
     * @return JSON字符串
     */
    public static <T> String getStringByEntity(T t)
	{
		JSONObject json = JSONObject.fromObject(t);
		return json.toString();
	}
	
    /**
     * 根据泛型实体列表转换成json字符串
     * @author HuangFeng(Mar 19, 2010)
     * @param <T> 泛型
     * @param list 泛型实体列表
     * @return JSON字符串
     */
	public static <T> String getStringByList(List<T> list)
	{  
		JSONObject json = null;  
        JSONArray jsonArray = new JSONArray();
        for(T t : list)
        {
             json = JSONObject.fromObject(t);  
             jsonArray.add(json);
        }
        return jsonArray.toString();  
	}
	
    /**
     * 把Map转换成json字符串
     * @author HuangFeng(Mar 19, 2010)
     * @param <T> 泛型
     * @param map 支持泛型Map<code><</code>String, T>
     * @return JSON字符串
     */
	public static <T> String getStringByMap(Map<String, T> map)
	{
		return getStringByEntity(map);
	}
	
	/**
     * 根据json字符串和Class转换成泛型实体
     * @author HuangFeng(Mar 19, 2010)
     * @param <T> 泛型
     * @param jsonString json字符串
	 * @param clazz 泛型类
     * @return 泛型实体
     */
	public static <T> T getClassEntityByString(String jsonString, Class<T> clazz)
	{	
		return getClassEntityByString(jsonString, clazz, null);
	}
	
	/**
     * 根据json字符串和Class转换成泛型实体
     * @author HuangFeng(Mar 19, 2010)
     * @param <T> 泛型
     * @param jsonString json字符串
	 * @param clazz 泛型类
	 * @param map 泛型实体中的List或Map属性值
     * @return 泛型实体
     */
	@SuppressWarnings("unchecked")
	public static <T> T getClassEntityByString(String jsonString, Class<T> clazz, Map<String, Class<T>> map)
	{
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		if(Validator.isEmpty(map))
		{
			return (T) JSONObject.toBean(jsonObject, clazz);
		}
		return (T) JSONObject.toBean(jsonObject, clazz, map);
	}
	
	/**
	 * 根据JSON字符串获得泛型类实体列表
	 * @author HuangFeng(Mar 19, 2010)
	 * @param <T> 泛型
	 * @param jsonString json字符串
	 * @param clazz 泛型类
	 * @param map 泛型实体中的List或Map属性值
	 * @return 泛型实体列表
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> getClassEntityListByString(String jsonString, Class<?> clazz, Map<String, Class<T>> map)
	{
		JSONArray jsonArray = JSONArray.fromObject(jsonString);
		List<T> list = new ArrayList<T>();
		T t ;
		JSONObject jsonObject;
		for (int i = 0; i < jsonArray.size(); i++) 
		{
			jsonObject = jsonArray.getJSONObject(i);
			if(Validator.isEmpty(map))
			{
				t = (T) JSONObject.toBean(jsonObject, clazz);
			} else {
				t = (T) JSONObject.toBean(jsonObject, clazz, map);
			}
			list.add(t);
		}
		return list;
	}
	
	/**
	 * 根据JSON字符串获得泛型类实体列表
	 * @see <code>List<T> getClassEntityListByString(String jsonString, Class<T> clazz, Map<String, Class<T>> map)</code>
	 * @author HuangFeng(Mar 19, 2010)
	 * @param <T> 泛型
	 * @param jsonString json字符串
	 * @param clazz 泛型类
	 * @return 泛型实体列表
	 */
	public static <T> List<T> getClassEntityListByString(String collectionName, String jsonString, Class<T> clazz)
	{
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		return getClassEntityListByString(jsonObject.get(collectionName).toString(), clazz, null);
	}
	
	public static <T> List<T> getClassEntityListByString(String collectionName, String jsonString, Class<T> clazz, Map<String, Class<T>> map)
	{
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		return getClassEntityListByString(jsonObject.get(collectionName).toString(), clazz, map);
	}
	

	/**
	 * 根据JSON字符串获得Map列表
	 * @param <T>
	 * @param jsonString JSON字符串
	 * @return Map<code><</code>String, T>
	 */
	@SuppressWarnings("unchecked")
	public static <T> Map<String, T> getMapByString(String jsonString)
	{
		JSONObject jsonObject = JSONObject.fromObject(jsonString);
		Iterator<?> keyIter = jsonObject.keys();
		String key;
		Object value;
		Map<String, T> valueMap = new HashMap<String, T>();
		while (keyIter.hasNext())
		{
			key = (String) keyIter.next();
			value = jsonObject.get(key);
			valueMap.put(key, (T) value);
		}
		return valueMap;
	}
	
    @SuppressWarnings("unchecked")
	public static void main(String[] args) {
    	Map map = new HashMap();
    	map.put("1", "1");
    	map.put("2", "2");
    	
    	System.out.println(JsonUtil.getStringByMap(map));
    	
    	map = JsonUtil.getMapByString("{\"2\":\"2\",\"1\":\"1\"}");
    	System.out.println(map.get("1"));
    	System.out.println(map.get("2"));
	}
}
